package org.ReportDesigner.reportModel;


import org.ReportDesigner.configurator.Configuration;
import org.ReportDesigner.controlModel.Type;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import org.apache.log4j.Logger;

import java.util.LinkedList;
import java.util.List;


/**
 * @see -
 */
@Type(type = "text", subType = "row", name = "tcell")
public class Cell extends ReportElement {
    private static final Logger log = Logger.getLogger(Cell.class);
    private String text;
    private List<CellAttribute> attributeList = new LinkedList<CellAttribute>();

    @Override
    public String getText() {
        return text;
    }

    @Override
    public void setText(String text) {
        this.text = text;
    }

    @Override
    public void addToDocument(Configuration configuration, Document document) throws DocumentException {
    //производим добавление элементов в тело документа используя addTo();
        List<Element> list = addTo(configuration);
        for (Element element: list){
            document.add(element);
        }

    }

    @Override
    public List<Element> addTo(Configuration configuration) {
        List<Element> elementList = new LinkedList<Element>();
        String str = this.getText();
        //проверяем содержит клетка текст или нет
        if (!str.isEmpty()){
            //добавляем текст в клетку
            Phrase phrase = new Phrase(str,
                FontFactory.getFont(configuration.getFont(), configuration.getFontEncoding()));
        elementList.add(phrase);
        }
        //проверяем клетку на содержине дочерних элементов отличных от текста
        // (обработка клетки контейнера)
        if(!this.getBody().isEmpty()) {
            //получаем колличество столбцов
            int i =getColumnNumber();
            int j;
            //создаем внутренний элемент таблицы
            PdfPTable table = new PdfPTable(i);
            //проходим пошагово дочерние элементы
            //в соответствии с возможной структурой производим пострение подтаблицы
            for (ReportElement element: this.getBody()){
                //получаем колличество ячеек в строке
                j = element.getBody().size();
                //в соответствии с возможной структурой производим пострение
                //если количество элементов равно 1 (первая строка)
                if(j == 1){
                    PdfPCell cell = new PdfPCell();
                    cell.setColspan(i);
                    cell.addElement(element.addTo(configuration).get(0));
                    table.addCell(cell);
                }
                //если колличесто элментов равно максимальному (последующие строки)
                if (j == i) {
                    for (Element cells: element.addTo(configuration)){
                        PdfPCell cell = new PdfPCell();
                        cell.addElement(cells);
                        table.addCell(cell);
                    }

                }
                // в случае некоректного задания, т.е. несогласованност предшествующих строк с последующими
                // мы добавлем их несогласованно в тело таблицы
                if(j != i && j!=1 ){
                    PdfPCell cell = new PdfPCell();
                    cell.setColspan(i);
                    PdfPTable subRow = new PdfPTable(j);
                    //добавляем ячейки в строку таблицы
                    for (Element cells: element.addTo(configuration)){
                        PdfPCell subCell = new PdfPCell();
                        subCell.addElement(cells);
                        subRow.addCell(subCell);
                    }
                    //добавляем елемент в подстроку
                    cell.addElement(subRow);
                    //добавляем строку в  таблицу
                    table.addCell(subRow);
                }

            }


        }
        return elementList;
    }

    /**
     *
     * @return - число сталбцов в контейнере
     * @see - используется только при конструировании сложных заголовков
     * когда ячейка содержит не только текст, но и подтаблицы
     */
    private int getColumnNumber(){
        List<ReportElement> list = this.getBody();
        int i = 0;
        for (ReportElement element: list)
            if (i < element.getBody().size()){
                i = element.getBody().size();
            }
        return i;
    }


    public List<CellAttribute> getAttributeList() {
        return attributeList;
    }

    public void addAttribute(String name, String value) {
        attributeList.add(new CellAttribute(name, value));
    }
}
class CellConstructor{

}